#include "driver/spi_master.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "W25Q128CMD.h"
#include "string.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"

#ifndef W25Q128_H
#define W25Q128_H

    #define BYTE 8
    // W25Q128 pin connection set
    #define PIN_NUM_MISO 15
    #define PIN_NUM_MOSI 23
    #define PIN_NUM_CLK  19
    #define PIN_NUM_CS   22

    #define W25Q128_CLK_FREQ_MHz 20
    #define MX_TRANS_LEN 4096


    #define FLASH_DEBUG 1
    #define W25Q128_BUSY 1
    #define W25Q128_STANDBY 0
    typedef struct {
        uint8_t SR1;
        uint8_t SR2;
        uint8_t SR_3;
    }W25Q128_SR;
    typedef struct 
    {
        spi_device_handle_t *w25q128_handle;//handle to operate W25Q128
        spi_device_handle_t w25q128;
        uint32_t sector_addr;//sector start addr 0x0000~0xffff
        uint32_t addr_offset;//addr offset in sector 0x000~0xfff
        uint8_t dummy;
        uint8_t *content;//content in sector 4096 bits is an sector of W25Q128.it is min length of erase operate
        uint8_t *write_buf;//write buf
        uint16_t manufacture_ID;
        uint64_t unique_DeviceID;
        W25Q128_SR sr;
    }W25Q128;
    



    void W25Q128_Init(W25Q128 *dev);
    void W25Q128_read_ManufactDeviceID(uint8_t cmd,spi_device_handle_t *spi_W25Q128,uint16_t *ID);
    void W25Q128_Read_Mnufact_DeviceID(W25Q128 *dev);
    void W25Q128_Read_Unique_ID(W25Q128 *dev);
    void W25Q128_Write_Enable(W25Q128 *dev);
    void W25Q128_Write_Disable(spi_device_handle_t *spi_W25Q128);
    void W25Q128_Read_Status(W25Q128 *dev);
    void W25Q128_Read_sector(W25Q128 *dev,uint16_t sector,uint16_t offset,uint16_t length);
    void W25Q128_Erase_sector(W25Q128 *dev,uint16_t sector);
    bool W25Q128_Check_busy(W25Q128 *dev);
    void W25Q128_PAGE_write(W25Q128 *dev,uint16_t sector,uint16_t page,uint8_t *src);//Write 1 page;
#endif 